from DBA.dbmanager import DBInterface
from MesureDAC import Mesure

class Campagne:
    """
    Classe d'acces aux campagnes references dans la BDD
    Table: PR5QTCA
    """
    def __init__(self,id=""):
        """
        Constructeur
        @param id identificateur de la campagne: soit on le rentre, soit il sera genere automatiquement.
        """
        self.id            = {"key":"ID","value":id}
        self.name        = {"key":"nom","value":""}
        self.env        = {"key":"env","value":""}
        self.radiostat        = {"key":"statradio","value":""}
        self.traficstat        = {"key":"stattrafic","value":""}
        self.manuel        = {"key":"manuel","value":""}
        self.automatique    = {"key":"automatique","value":""}
        self.step        = {"key":"step","value":""}
        self.ensMesures        = []
        self.__interfacebase    = DBInterface()
        if not id:
            self.id["value"]    = str(self.__interfacebase.createNewID());
    
    def addMesure(self,mesure):
        """
        Ajout d'une mesure a la campagne courante
        @param mesure Objet de type Mesure()
        """
        self.ensMesures.append(mesure)
    
    def nbMesures(self):
        """
        Retourne le nombre de mesures associes a la campagne
        """
        return self.ensMesures.count()

    def createByDico(self,dico):
        """
        Creation d'une campagne depuis un dictionnaire
        """
        self.name["value"]         = dico[self.name["key"]]
        self.env["value"]         = dico[self.env["key"]]
        self.radiostat["value"]     = dico[self.radiostat["key"]]
        self.traficstat["value"]     = dico[self.traficstat["key"]]
        self.manuel["value"]         = dico[self.manuel["key"]]
        self.automatique["value"]     = dico[self.automatique["key"]]
        self.step["value"]         = dico[self.step["key"]]

    def insertToDb(self,idSalle,idAP):
        """
        Insertion de la campagne dans la BDD.
        Le couple idSalle/idAP est necessaire pour identifier precisement la campagne.
        @param idSalle identificateur unique de la salle
        @param idAP identificateur unique de l'AP
        """
        dico = self.createCampagneDico(idAP,idSalle)
        self.__interfacebase.insert(self.__interfacebase.campagnetablename,self.__interfacebase.campagnemapping,dico)
        inter = self.createIntermediaireDico(idAP,idSalle)
        self.__interfacebase.insert(self.__interfacebase.ref_AP_Salle_Campagnetablename,self.__interfacebase.ref_AP_Salle_CampagneMapping,inter)
        for mesure in self.ensMesures:
            mesure.insertToDb(self.id["value"])
  

    def updateIntoDb(self,idSalle,idAP):
        """
        Mise a jour de la campagne dans la BDD.
        Le couple idSalle/idAP est necessaire pour identifier precisement la campagne.
        @param idSalle identificateur unique de la salle
        @param idAP identificateur unique de l'AP
        """
        dico = self.createCampagneDico(idAP,idSalle)
        self.__interfacebase.update(self.__interfacebase.campagnetablename,self.__interfacebase.campagnemapping,dico)
        inter = self.createIntermediaireDico(idAP,idSalle)   
        self.__interfacebase.update(self.__interfacebase.ref_AP_Salle_Campagnetablename,self.__interfacebase.ref_AP_Salle_CampagneMapping,inter)
        for mesure in self.ensMesures:
            mesure.updateIntoDb(self.id["value"])

    def selectMesuresFromDb(self):
        """
        Retourne toutes les mesures correspondantes a la campagne en cours
        """
        key ={}
        key["link_ca"] = self.id["value"]
        self.ensMesures=self.__interfacebase.selectTable(self.__interfacebase.mesuretablename,self.__interfacebase.mesuremapping,key)

    def deleteFromDb(self):
        """
        Suppression de la campagne de la base de donnee
        """
        #valeur pour la table pr5qtca
        key={}
        key["ID"]=self.id["value"]
        #On initialise au cas ou il n'y ai pas de campagnes
        elementsuppr=0
        #On recupere les valeurs
        self.selectMesuresFromDb()
        #On supprime toutes les mesures
        for mesure in self.ensMesures:
            m = Mesure(mesure['ID'])
            elementsuppr=elementsuppr+int(m.deleteFromDb())
        #Puis on supprime la campagne
        elementsuppr=elementsuppr + int(self.__interfacebase.deleteFromTable(self.__interfacebase.campagnetablename,self.__interfacebase.campagnemapping,key))
        return elementsuppr
    
    def createCampagneDico(self,idAP,idSalle):
        """
        Creation d'un dictionnaire de campagne
        Le couple idSalle/idAP est necessaire pour identifier precisement la campagne.
        @param idSalle identificateur unique de la salle
        @param idAP identificateur unique de l'AP
        """
        dico ={}
        dico[self.id["key"]]        = self.id["value"]
        dico["link_sa"]            = idSalle
        dico["link_ap"]            = idAP
        dico[self.name["key"]]        = self.name["value"]
        dico[self.env["key"]]        = self.env["value"]
        dico[self.radiostat["key"]]    = self.radiostat["value"]
        dico[self.traficstat["key"]]    = self.traficstat["value"]
        dico[self.manuel["key"]]    = self.manuel["value"]
        dico[self.automatique["key"]]    = self.automatique["value"]
        dico[self.step["key"]]        = self.step["value"]
        return dico

    def createIntermediaireDico(self,idAP,idSalle):
        """
        Creation d'un dictionnaire reduit de campagne
        Le couple idSalle/idAP est necessaire pour identifier precisement la campagne.
        @param idSalle identificateur unique de la salle
        @param idAP identificateur unique de l'AP
        """
        dico ={}
        dico[self.id["key"]]        = self.id["value"]
        dico["link_sa"]            = idSalle
        dico["link_ap"]            = idAP
        return dico

if __name__=="__main__":
    bat = Salle()    
    bat.name["value"]        = "test";
    #bat.description["value"]    = "t";
    bat.xposition["value"]        = "tz";
    bat.yposition["value"]        = "ta";
    bat.zposition["value"]        = "te";
    bat.height["value"]        = "tq";
    bat.width["value"]        = "t";
    
    print bat
